﻿using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AiChiTu.TraceabilitySystem.Write.API.ExceptionFilters
{
	/// <summary>
	/// 全局异常拦截器
	/// 全局异常拦截器是怎么写的?
	/// 1.新建一个类; 2.继承 IExceptionFilter 接口,异常过滤器的接口; 3.新建构造方法,注入NLog系统日志的接口; 4.在 OnException 方法里将 trycatch 之外发生的异常,记录到系统日志里; 5.同时记录发生异常的时间,控制器名,方法名;
	/// </summary>
	public class ErrorExceptionFilter : IExceptionFilter
	{
		/// <summary>
		/// 系统日志
		/// </summary>
		private readonly ILogger<ErrorExceptionFilter> logger;
		/// <summary>
		/// 构造方法
		/// </summary>
		/// <param name="logger">系统日志</param>
		public ErrorExceptionFilter(ILogger<ErrorExceptionFilter> logger)
		{
			this.logger = logger;
		}
		/// <summary>
		/// 当trycatch之外的异常发生时
		/// </summary>
		/// <param name="context">异常上下文</param>
		public void OnException(ExceptionContext context)
		{
			string controllerName = context.RouteData?.Values["controller"]?.ToString() ?? "未知控制器";
			string actionName = context.RouteData?.Values["action"]?.ToString() ?? "未知方法";

			logger.LogError($"全局异常拦截器拦截到的异常=> 控制器名: {controllerName}, 方法名: {actionName}, 异常信息: {context.Exception.Message}");
			context.ExceptionHandled = true;// 标记异常为已处理
		}
	}
}
